//测试代码

#include <unistd.h>

#include "../Logs/superlog.h"

void test_log(const std::string &name) //简单的功能测试
{
    INFO("%s", "测试开始");
    superlog::Logger::ptr logger = superlog::LoggerManager::getInstance().getLogger(name);
    logger->debug("%s", "测试日志");
    logger->info("%s", "测试日志");
    logger->warn("%s", "测试日志");
    logger->error("%s", "测试日志");
    logger->fatal("%s", "测试日志");
    INFO("%s", "测试完毕");
}

int main()
{
    std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
    builder->buildLoggerName("sync_logger");
    builder->buildLoggerLevel(superlog::LogLevel::value::DEBUG);
    builder->buildFormatter("[%c][%f:%l][%p]%m%n");
    builder->buildLoggerType(superlog::LoggerType::LOGGER_SYNC);
    builder->buildSink<superlog::StdoutSink>();
    builder->buildSink<superlog::FileSink>("./logfile/sync.log");
    builder->buildSink<superlog::RollBySizeSink>("./logfile/roll-sync-by-size", 1024*1024);
    builder->build();
    
    test_log("sync_logger");
    
    return 0;
}


// void test_log()
// {
//     // superlog::Logger::ptr logger = superlog::LoggerManager::getInstance().getLogger("async_logger");
//     // logger->debug("%s", "测试日志");
//     // logger->info("%s", "测试日志");
//     // logger->warn("%s", "测试日志");
//     // logger->error("%s", "测试日志");
//     // logger->fatal("%s", "测试日志");

//     // size_t count = 0;
//     // while(count < 500000)
//     // {
//     //     logger->fatal("测试日志-%d", count++);
//     // }

//     // 下面只是进行日志的标准输出打印
//     DEBUG("%s", "测试日志");
//     INFO("%s", "测试日志");
//     WARN("%s", "测试日志");
//     ERROR("%s", "测试日志");
//     FATAL("%s", "测试日志");

//     size_t count = 0;
//     while(count < 500000)
//     {
//         FATAL("测试日志-%d", count++);
//     }
// }

// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c][%f:%l]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     builder->buildEnableUnSafeAsync();
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     builder->build();
    
//     test_log();
    
//     return 0;
// }


// void test_log()
// {
//     superlog::Logger::ptr logger = superlog::LoggerManager::geiInstance().getLogger("async_logger");
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     size_t count = 0;
//     while(count < 500000)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//     }
// }

// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     builder->buildEnableUnSafeAsync();
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     builder->build();
    
//     test_log();
    
//     return 0;
// }


// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::LocalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     builder->buildEnableUnSafeAsync();
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     superlog::Logger::ptr logger = builder->build();
    
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     size_t count = 0;
//     while(count < 500000)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//     }
//     return 0;
// }


// int main()
// {
//     // 读取文件数据，一点点写入缓冲区，最终将缓冲区数据写入文件，判断生成的新文件与源文件是否一致
//     std::ifstream ifs("./logfile/test.log", std::ios::binary); // 以二进制的方式读取test.log文件数据
//     if(!ifs.is_open())
//     {
//         std::cout << "open faild" << std::endl;
//         return -1;
//     }
//     ifs.seekg(0, std::ios::end); //读写位置跳转到文件末尾
//     size_t fsize = ifs.tellg(); //获取当前读写位置相对于起始位置的偏移量(文件长度)
//     ifs.seekg(0, std::ios::beg); //读写位置重新跳转到起始位置
//     std::string body;
//     body.resize(fsize);
//     ifs.read(&body[0], fsize); //将数据读取之后放到body中(这里不能取body.c_str()，因为返回的const char* 是不能修改指定控件内容的)
//     if(!ifs.good())
//     {
//         std::cout << "read error" << std::endl;
//         return -1;
//     }
//     ifs.close();

//     superlog::Buffer buffer;
//     for(int i = 0; i < body.size(); i++)
//     {
//         buffer.push(&body[i], 1);
//     }
//     std::ofstream ofs("./logfile/tmp.log", std::ios::binary);
//
//     // ofs.write(buffer.begin(), buffer.readAbleSize());
//
//     size_t rsize = buffer.readAbleSize(); //可读数据长度(不能将buffer.readAbleSize()直接作为for循环的条件，因为它是变化的)
//     for(int i = 0; i < rsize; i++)
//     {
//         ofs.write(buffer.begin(), 1);
//         if(!ofs.good())
//         {
//             std::cout << "write error!" << std::endl;
//             return -1;
//         }
//         buffer.moveReader(1);
//     }
//     ofs.close();
//     return 0;
// }


// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::LocalLoggerBuilder());
//     builder->buildLoggerName("sync_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_SYNC);
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/test.log");
//     builder->buildSink<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024);
//     superlog::Logger::ptr logger = builder->build();
    
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志"); //限制等级，无法输出
//     logger->info(__FILE__, __LINE__, "%s", "测试日志"); //限制等级，无法输出
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     size_t cursize = 0;
//     size_t count = 0;
//     while(cursize < 1024*1024*10)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 20; //消息进行组织之后，总体远不止20byte，最终输出的内容会更多一些(统计大小小于实际大小)
//     }
//     return 0;
//}


// int main()
// {
//     std::string logger_name = "sync_logger";
//     superlog::LogLevel::value limit_level = superlog::LogLevel::value::WARN;
//     superlog::Formatter::ptr fmt(new superlog::Formatter("[%d{%H:%M:%S}][%c][%f:%l][%p]%T%m%n"));
//     superlog::LogSink::ptr stdout_lsp = superlog::SinkFactory::create<superlog::StdoutSink>();
//     superlog::LogSink::ptr file_lsp = superlog::SinkFactory::create<superlog::FileSink>("./logfile/test.log");
//     superlog::LogSink::ptr roll_lsp = superlog::SinkFactory::create<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024); //1M
//     std::vector<superlog::LogSink::ptr> sinks = {stdout_lsp, file_lsp, roll_lsp};
//     superlog::Logger::ptr logger(new superlog::SyncLogger(logger_name, limit_level, fmt, sinks));
    
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志"); //限制等级，无法输出
//     logger->info(__FILE__, __LINE__, "%s", "测试日志"); //限制等级，无法输出
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");

//     size_t cursize = 0;
//     size_t count = 0;
//     while(cursize < 1024*1024*10)
//     {
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 20; //消息进行组织之后，总体远不止20byte，最终输出的内容会更多一些(统计大小小于实际大小)
//     }
//     return 0;
// }


// int main()
// {
//     superlog::LogMsg msg(superlog::LogLevel::value::INFO, 42, "maic.c", "root", "格式化功能测试...");
//     superlog::Formatter fmt;
//     std::string str = fmt.format(msg);

//     superlog::LogSink::ptr stdout_lsp = superlog::SinkFactory::create<superlog::StdoutSink>();
//     superlog::LogSink::ptr file_lsp = superlog::SinkFactory::create<superlog::FileSink>("./logfile/test.log");
//     superlog::LogSink::ptr roll_lsp = superlog::SinkFactory::create<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024); //1M
    
//     stdout_lsp->log(str.c_str(), str.size());
//     file_lsp->log(str.c_str(), str.size());
//     size_t cursize = 0;
//     size_t count = 0;
//     while(cursize < 1024*1024*10) //写入10M数据
//     {
//         std::string tmp = str + std::to_string(count++);
//         roll_lsp->log(tmp.c_str(), tmp.size());
//         cursize += tmp.size();
//     }
//     return 0;
// }


// int main()
// {
//     superlog::LogMsg msg(superlog::LogLevel::value::INFO, 42, "maic.c", "root", "格式化功能测试...");
//     superlog::Formatter fmt("abc[%d{%H:%M:%S}] %m%n");

//     //测试边缘样例
//     //superlog::Formatter fmt("abc%%xyl[%d{%H:%M:%S}] %m%n"); //测试%%的情况和原始字符串的展示
//     //superlog::Formatter fmt("abc%%xyl[%d{%H:%M:%S}] %m%"); //测试%后面没有对应格式化字符的情况
//     //superlog::Formatter fmt("abc%%xyl%g%g%g[%d{%H:%M:%S}] %m%g"); //测试其它的格式化字符的情况
//     // 测试子规则{}匹配出错的情况 —— 没有'}'
//     //superlog::Formatter fmt("abc%%xyl[%d{%H:%M:%S] %m%n");
//     //superlog::Formatter fmt("abc%%xyl[%d{%H:%M:%S}] %m%n{");
    
//     std::string str = fmt.format(msg);
//     std::cout << str << std::endl;

//     return 0;
// }

// int main()
// {
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::DEBUG) << superlog::LogLevel::toString(superlog::LogLevel::value::DEBUG) << CLR_CLR << std::endl;
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::INFO) << superlog::LogLevel::toString(superlog::LogLevel::value::INFO) << CLR_CLR << std::endl;
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::WARN) << superlog::LogLevel::toString(superlog::LogLevel::value::WARN) << CLR_CLR << std::endl;
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::ERROR) << superlog::LogLevel::toString(superlog::LogLevel::value::ERROR) << CLR_CLR << std::endl;
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::FATAL) << superlog::LogLevel::toString(superlog::LogLevel::value::FATAL) << CLR_CLR << std::endl;
//     std::cout << superlog::LogLevel::setColor(superlog::LogLevel::value::OFF) << superlog::LogLevel::toString(superlog::LogLevel::value::OFF) << CLR_CLR << std::endl;
//     return 0;
// }


// int main()
// {
//     std::cout << superlog::util::Date::now() << std::endl;
//     std::string pathname = "./abc/xyz/test.txt";
//     superlog::util::File::createDirectory(superlog::util::File::path(pathname));
//     return 0;
// }